package com.rw.tool.util.escape;

import com.rw.tool.util.string.StringUtil;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 转义符工具类
 */
public class EscapeUtil {
    private static final String INPUT_IS_NULL = "Input string is null!";

    private static final String END_WITH_ESCAPE = "Cannot end with an escape character!";

    /**
     * 解析字符串，解析出其中的转义字符
     *
     * @param input  被解析的字符串
     * @param escape 转义字符
     * @return 转义链
     */
    public static List<EscapeElement> parse(String input, char escape) {
        if (input == null) {
            throw new EscapeParseException(INPUT_IS_NULL);
        }

        if (StringUtil.isEmpty(input)) {
            return Collections.emptyList();
        }

        StringBuilder content = new StringBuilder();
        List<EscapeElement> chain = new ArrayList<>();
        // 遍历输入字符串，挑出转义符额外处理
        char[] inputChars = input.toCharArray();
        for (int i = 0; i < inputChars.length; i++) {
            char inputChar = inputChars[i];

            // 若不是转义符，正常处理
            if (inputChar != escape) {
                content.append(inputChar);
                continue;
            }

            // 先将原本的普通字符串放入转义链
            if (content.length() != 0) {
                chain.add(EscapeElement.newContent(content.toString()));
                content = new StringBuilder();
            }

            // 判断转义字符后是否还有字符
            if (i == inputChars.length - 1) {
                throw new EscapeParseException(END_WITH_ESCAPE);
            }

            // 连同转义符后的字符一起加入转义链
            String escapeContent = String.valueOf(inputChars[i + 1]);
            chain.add(EscapeElement.newEscape(inputChar, escapeContent));
            i++;
        }

        // 结束后，如果还有内容，则把剩下的字符串加入转义链
        if (content.length() != 0) {
            chain.add(EscapeElement.newContent(content.toString()));
        }

        return chain;
    }
}
